/**
 * 检查必填字段（从上到下第一个缺失字段）
 * @param {Array} requiredFields - 必填字段配置
 * @param {Object} formData - 表单数据对象
 * @returns {boolean} 是否通过验证
 */
export const validateRequiredFields = (requiredFields, formData) => {
	const missingField = requiredFields.find(field => {
		const value = formData[field.key]
		return value === undefined || value === null || value === ''
	})

	if (missingField) {
		const action = missingField.type === 'select' ? '请选择' : '请填写'
		uni.showToast({
			title: `${action}：${missingField.name}`,
			icon: 'none',
			duration: 3000
		})
		return false
	}
	return true
}
import store from '@/store/index.js'
import { config } from '@/common/config.js'
// 获取token
export const getToken = () => {
	return store.state.token
}


/**
 * 过滤掉图片类型的文件
 * @param {Array} filesArray - 包含文件信息的数组，每个元素应包含url属性
 * @returns {Array} 返回过滤掉图片文件后的新数组
 */
export function filterOutImages (filesArray) {
	// 定义图片文件的扩展名列表
	const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']

	// 使用filter方法过滤数组，保留非图片文件
	return filesArray.filter(item => {
		// 获取文件扩展名并转换为小写
		const extension = item.filename.substring(item.filename.lastIndexOf('.')).toLowerCase()
		// 检查扩展名是否不在图片扩展名列表中
		return !imageExtensions.includes(extension)
	})
}

/**
 * 过滤出图片文件
 * @param {Array} files - 文件列表，每个文件对象应包含url属性
 * @returns {Array} 返回只包含图片文件的数组
 */
export function filterImageFiles (files) {
	// 定义图片文件扩展名列表
	const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']
	// 使用filter方法过滤文件
	return files.filter(file => {
		// 获取文件扩展名并转换为小写
		const extension = file.filename.substring(file.filename.lastIndexOf('.')).toLowerCase()
		// 检查扩展名是否在图片扩展名列表中
		return imageExtensions.includes(extension)
	})
}


/**
		 * 生成32位唯一ID
		 * 结合时间戳和26个小写字母，确保唯一性
		 */
export function generateUniqueId () {
	// 26个小写字母
	const letters = 'abcdefghijklmnopqrstuvwxyz'
	// 当前时间戳，精确到毫秒
	const timestamp = new Date().getTime().toString()
	// 生成剩余的随机字母部分
	let randomLetters = ''
	const remainingLength = 32 - timestamp.length

	for (let i = 0; i < remainingLength; i++) {
		// 提供跨平台兼容的随机数生成
		let randomIndex = 0
		try {
			// 尝试使用crypto.getRandomValues（Web环境）
			if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
				const randomValues = new Uint8Array(1)
				crypto.getRandomValues(randomValues)
				randomIndex = randomValues[0]
			} else {
				// 微信小程序环境回退到Math.random
				randomIndex = Math.floor(Math.random() * 256)
			}
		} catch (e) {
			// 捕获任何异常，确保使用Math.random作为最终回退
			randomIndex = Math.floor(Math.random() * 256)
		}
		randomLetters += letters[randomIndex % letters.length]
	}

	// 组合时间戳和随机字母生成32位唯一ID
	return timestamp + randomLetters
}

// 获取当前时间
export function getCurrentTime () {
	const now = new Date()
	const year = now.getFullYear()
	const month = String(now.getMonth() + 1).padStart(2, '0')
	const day = String(now.getDate()).padStart(2, '0')
	const hours = String(now.getHours()).padStart(2, '0')
	const minutes = String(now.getMinutes()).padStart(2, '0')
	const seconds = String(now.getSeconds()).padStart(2, '0')
	return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}

/**
 * 下载并打开文件
 * @param {string} filename - 文件路径或文件名
 * @param {object} options - 可选配置项
 * @param {object} options.header - 请求头信息
 * @param {string} options.fileName - 自定义文件名（可选）
 * @returns {Promise} 返回Promise对象
 */
export const downloadAndOpenFile = (filename, options = {}) => {
	return new Promise((resolve, reject) => {
		const header = options.header || {};
		
		// 处理URL拼接，确保不会有重复的斜杠
		const baseUrl = config.baseUrl.replace(/\/$/, ''); // 移除baseUrl末尾的斜杠
		const fileUrl = filename.replace(/^\//, ''); // 移除filename开头的斜杠
		const fullUrl = `${baseUrl}/${fileUrl}`;
		
		// 获取文件名（用于App端保存）
		const originalFilename = options.fileName || fileUrl.split('/').pop() || 'download_file';
		
		// #ifdef MP-WEIXIN
		// 微信小程序平台
		uni.downloadFile({
			url: fullUrl,
			header: {
				...header,
				'token': getToken()
			},
			success(res) {
				if (res.statusCode === 200) {
					// 获取文件系统管理器
					const fs = wx.getFileSystemManager();
					
					fs.saveFile({
						tempFilePath: res.tempFilePath,
						success: function (saveResult) {
							uni.openDocument({
								filePath: saveResult.savedFilePath,
								showMenu: true,
								success: function (fileRes) {
									console.log('打开文档成功', fileRes);
									resolve(fileRes);
								},
								fail: function (err) {
									console.error('打开文档失败', err);
									uni.$u.toast('打开文档失败');
									reject(err);
								}
							});
						},
						fail: function (error) {
							console.error('保存文件失败', error);
							uni.$u.toast('保存文件失败');
							reject(error);
						}
					});
				} else {
					const errorMsg = `下载文件失败，状态码：${res.statusCode}`;
					console.error(errorMsg);
					uni.$u.toast('下载文件失败');
					reject(new Error(errorMsg));
				}
			},
			fail: function (error) {
				console.error('下载文件请求失败', error);
				uni.$u.toast('网络请求失败');
				reject(error);
			}
		});
		// #endif
		
		// #ifdef APP-PLUS
		// App平台
		// 构建请求头
		const headerObj = {
			'token': getToken(),
			...header
		};
		
		// 创建下载任务
		const downloadTask = plus.downloader.createDownload(fullUrl, {
			httpMethod: 'GET',
			filename: '_doc/downloads/' + originalFilename // 保存路径
		}, function (download, status) {
			if (status === 200) {
				// 下载成功，打开文件
				plus.runtime.openFile(download.filename, {
					showMenu: true
				}, function (success) {
					console.log('App端打开文档成功', success);
					resolve(success);
				}, function (error) {
					console.error('App端打开文档失败', error);
					uni.$u.toast('打开文档失败');
					reject(error);
				});
			} else {
				const errorMsg = `下载文件失败，状态码：${status}`;
				console.error(errorMsg);
				uni.$u.toast('下载文件失败');
				reject(new Error(errorMsg));
			}
		});
		
		// 设置请求头
		for (let key in headerObj) {
			downloadTask.setRequestHeader(key, headerObj[key]);
		}
		
		// 开始下载
		downloadTask.start();
		
		// 监听下载进度（可选）
		downloadTask.addEventListener('statechanged', function (task, status) {
			if (status === 200) {
				// 下载完成
				console.log('下载完成，文件路径：', task.filename);
			} else if (status === 404) {
				console.error('文件不存在');
			}
		}, false);
		// #endif
		
		// #ifdef H5
		// H5平台（简单实现）
		const link = document.createElement('a');
		link.href = fullUrl;
		link.download = originalFilename;
		link.style.display = 'none';
		document.body.appendChild(link);
		link.click();
		document.body.removeChild(link);
		console.log('H5端下载文件', originalFilename);
		resolve({ success: true });
		// #endif
	});
}